﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using BLL;
using Exceptions;
namespace WCF
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "WCFReserva" in code, svc and config file together.
    public class WCFReserva : IWCFReserva
    {
        public List<DTO.Reserva> list()
        {
            BLLReserva bllReservas = new BLLReserva();
            List<BTO.Reserva> btoReservas = bllReservas.list();
            List<DTO.Reserva> dtoReservas = new List<DTO.Reserva>();
            DTO.Reserva dtoReserva;

            foreach (BTO.Reserva btoReserva in btoReservas)
            {
                dtoReserva = new DTO.Reserva();
                dtoReserva.IDReserva = btoReserva.IDReserva;
                dtoReserva.IDCliente = btoReserva.IDCliente;
                dtoReserva.IDPartida = btoReserva.IDPartida;
                dtoReserva.IDChegada = btoReserva.IDChegada;
                dtoReserva.IDTransporteIda =  btoReserva.IDTransporteIda;
                dtoReserva.IDTransporteVolta =  btoReserva.IDTransporteVolta;
                dtoReserva.IDAgencia = btoReserva.IDAgencia;
                dtoReserva.IDAlojamento = btoReserva.IDAlojamento;
                dtoReserva.nrPessoas = btoReserva.nrPessoas;
                dtoReserva.dataReserva = btoReserva.dataReserva;
                dtoReserva.dataPartida = btoReserva.dataPartida;
                dtoReserva.dataChegada = btoReserva.dataChegada;

                dtoReservas.Add(dtoReserva);
            }

            return dtoReservas;
        }

        public DTO.Reserva getByID(int id)
        {
            BLLReserva bllReserva = new BLLReserva();
            DTO.Reserva dtoReserva = new DTO.Reserva();

            try
            {
                BTO.Reserva btoReserva = bllReserva.getByID(id);

                dtoReserva.IDReserva = btoReserva.IDReserva;
                dtoReserva.IDCliente = btoReserva.IDCliente;
                dtoReserva.IDPartida = btoReserva.IDPartida;
                dtoReserva.IDChegada = btoReserva.IDChegada;
                dtoReserva.IDTransporteIda = btoReserva.IDTransporteIda;
                dtoReserva.IDTransporteVolta = btoReserva.IDTransporteVolta;
                dtoReserva.IDAgencia = btoReserva.IDAgencia;
                dtoReserva.IDAlojamento = btoReserva.IDAlojamento;
                dtoReserva.nrPessoas = btoReserva.nrPessoas;
                dtoReserva.dataReserva = btoReserva.dataReserva;
                dtoReserva.dataPartida = btoReserva.dataPartida;
                dtoReserva.dataChegada = btoReserva.dataChegada;

            }
            catch (NotFoundReservaException e)
            {
                throw new NotFoundReservaException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Reserva não encontrada!");
            }

            return dtoReserva;

        }

        public List<DTO.Reserva> getByIDChegada(int id)
        {
            BLLReserva bllReservas = new BLLReserva();
            List<DTO.Reserva> dtoReservas = new List<DTO.Reserva>();
            DTO.Reserva dtoReserva;

            try
            {
                List<BTO.Reserva> btoReservas = bllReservas.getByIDChegada(id);

                foreach (BTO.Reserva btoReserva in btoReservas)
                {
                    dtoReserva = new DTO.Reserva();
                    dtoReserva.IDReserva = btoReserva.IDReserva;
                    dtoReserva.IDCliente = btoReserva.IDCliente;
                    dtoReserva.IDPartida = btoReserva.IDPartida;
                    dtoReserva.IDChegada = btoReserva.IDChegada;
                    dtoReserva.IDTransporteIda = btoReserva.IDTransporteIda;
                    dtoReserva.IDTransporteVolta = btoReserva.IDTransporteVolta;
                    dtoReserva.IDAgencia = btoReserva.IDAgencia;
                    dtoReserva.IDAlojamento = btoReserva.IDAlojamento;
                    dtoReserva.nrPessoas = btoReserva.nrPessoas;
                    dtoReserva.dataReserva = btoReserva.dataReserva;
                    dtoReserva.dataPartida = btoReserva.dataPartida;
                    dtoReserva.dataChegada = btoReserva.dataChegada;

                    dtoReservas.Add(dtoReserva);
                }
            }
            catch (NotFoundReservaException e)
            {
                throw new NotFoundReservaException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhuma reserva não encontrada!");
            }

            return dtoReservas;

        }

        public List<DTO.Reserva> getByIDPartida(int id)
        {

            BLLReserva bllReservas = new BLLReserva();
            List<DTO.Reserva> dtoReservas = new List<DTO.Reserva>();
            DTO.Reserva dtoReserva;

            try
            {
                List<BTO.Reserva> btoReservas = bllReservas.getByIDPartida(id);

                foreach (BTO.Reserva btoReserva in btoReservas)
                {
                    dtoReserva = new DTO.Reserva();
                    dtoReserva.IDReserva = btoReserva.IDReserva;
                    dtoReserva.IDCliente = btoReserva.IDCliente;
                    dtoReserva.IDPartida = btoReserva.IDPartida;
                    dtoReserva.IDChegada = btoReserva.IDChegada;
                    dtoReserva.IDTransporteIda = btoReserva.IDTransporteIda;
                    dtoReserva.IDTransporteVolta = btoReserva.IDTransporteVolta;
                    dtoReserva.IDAgencia = btoReserva.IDAgencia;
                    dtoReserva.IDAlojamento = btoReserva.IDAlojamento;
                    dtoReserva.nrPessoas = btoReserva.nrPessoas;
                    dtoReserva.dataReserva = btoReserva.dataReserva;
                    dtoReserva.dataPartida = btoReserva.dataPartida;
                    dtoReserva.dataChegada = btoReserva.dataChegada;

                    dtoReservas.Add(dtoReserva);
                }
            }
            catch (NotFoundReservaException e)
            {
                throw new NotFoundReservaException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhuma reserva não encontrada!");
            }

            return dtoReservas;

        }

        public List<DTO.Reserva> getByIDTransporteIda(int id)
        {
            BLLReserva bllReservas = new BLLReserva();
            List<DTO.Reserva> dtoReservas = new List<DTO.Reserva>();
            DTO.Reserva dtoReserva;

            try
            {
                List<BTO.Reserva> btoReservas = bllReservas.getByIDTransporteIda(id);

                foreach (BTO.Reserva btoReserva in btoReservas)
                {
                    dtoReserva = new DTO.Reserva();
                    dtoReserva.IDReserva = btoReserva.IDReserva;
                    dtoReserva.IDCliente = btoReserva.IDCliente;
                    dtoReserva.IDPartida = btoReserva.IDPartida;
                    dtoReserva.IDChegada = btoReserva.IDChegada;
                    dtoReserva.IDTransporteIda = btoReserva.IDTransporteIda;
                    dtoReserva.IDTransporteVolta = btoReserva.IDTransporteVolta;
                    dtoReserva.IDAgencia = btoReserva.IDAgencia;
                    dtoReserva.IDAlojamento = btoReserva.IDAlojamento;
                    dtoReserva.nrPessoas = btoReserva.nrPessoas;
                    dtoReserva.dataReserva = btoReserva.dataReserva;
                    dtoReserva.dataPartida = btoReserva.dataPartida;
                    dtoReserva.dataChegada = btoReserva.dataChegada;

                    dtoReservas.Add(dtoReserva);
                }
            }
            catch (NotFoundReservaException e)
            {
                throw new NotFoundReservaException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhuma reserva encontrada!");
            }

            return dtoReservas;

        }

        public List<DTO.Reserva> getByIDTransporteVolta(int id)
        {
            BLLReserva bllReservas = new BLLReserva();
            List<DTO.Reserva> dtoReservas = new List<DTO.Reserva>();
            DTO.Reserva dtoReserva;

            try
            {
                List<BTO.Reserva> btoReservas = bllReservas.getByIDTransporteVolta(id);

                foreach (BTO.Reserva btoReserva in btoReservas)
                {
                    dtoReserva = new DTO.Reserva();
                    dtoReserva.IDReserva = btoReserva.IDReserva;
                    dtoReserva.IDCliente = btoReserva.IDCliente;
                    dtoReserva.IDPartida = btoReserva.IDPartida;
                    dtoReserva.IDChegada = btoReserva.IDChegada;
                    dtoReserva.IDTransporteIda = btoReserva.IDTransporteIda;
                    dtoReserva.IDTransporteVolta = btoReserva.IDTransporteVolta;
                    dtoReserva.IDAgencia = btoReserva.IDAgencia;
                    dtoReserva.IDAlojamento = btoReserva.IDAlojamento;
                    dtoReserva.nrPessoas = btoReserva.nrPessoas;
                    dtoReserva.dataReserva = btoReserva.dataReserva;
                    dtoReserva.dataPartida = btoReserva.dataPartida;
                    dtoReserva.dataChegada = btoReserva.dataChegada;

                    dtoReservas.Add(dtoReserva);
                }
            }
            catch (NotFoundReservaException e)
            {
                throw new NotFoundReservaException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhuma reserva encontrada!");
            }

            return dtoReservas;


        }

        public List<DTO.Reserva> getByCliente(int idCliente)
        {
            BLLReserva bllReservas = new BLLReserva();
            List<DTO.Reserva> dtoReservas = new List<DTO.Reserva>();
            DTO.Reserva dtoReserva;

            try
            {
                List<BTO.Reserva> btoReservas = bllReservas.getByCliente(idCliente);

                foreach (BTO.Reserva btoReserva in btoReservas)
                {
                    dtoReserva = new DTO.Reserva();
                    dtoReserva.IDReserva = btoReserva.IDReserva;
                    dtoReserva.IDCliente = btoReserva.IDCliente;
                    dtoReserva.IDPartida = btoReserva.IDPartida;
                    dtoReserva.IDChegada = btoReserva.IDChegada;
                    dtoReserva.IDTransporteIda = btoReserva.IDTransporteIda;
                    dtoReserva.IDTransporteVolta = btoReserva.IDTransporteVolta;
                    dtoReserva.IDAgencia = btoReserva.IDAgencia;
                    dtoReserva.IDAlojamento = btoReserva.IDAlojamento;
                    dtoReserva.nrPessoas = btoReserva.nrPessoas;
                    dtoReserva.dataReserva = btoReserva.dataReserva;
                    dtoReserva.dataPartida = btoReserva.dataPartida;
                    dtoReserva.dataChegada = btoReserva.dataChegada;

                    dtoReservas.Add(dtoReserva);
                }
            }
            catch (NotFoundClienteReservasException e)
            {
                throw new NotFoundClienteReservasException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhuma reserva encontrada!");
            }

            return dtoReservas;
        }

        public List<DTO.Reserva> getByAgencia(int idAgencia)
        {
            BLLReserva bllReservas = new BLLReserva();
            List<DTO.Reserva> dtoReservas = new List<DTO.Reserva>();
            DTO.Reserva dtoReserva;

            try
            {
                List<BTO.Reserva> btoReservas = bllReservas.getByAgencia(idAgencia);

                foreach (BTO.Reserva btoReserva in btoReservas)
                {
                    dtoReserva = new DTO.Reserva();
                    dtoReserva.IDReserva = btoReserva.IDReserva;
                    dtoReserva.IDCliente = btoReserva.IDCliente;
                    dtoReserva.IDPartida = btoReserva.IDPartida;
                    dtoReserva.IDChegada = btoReserva.IDChegada;
                    dtoReserva.IDTransporteIda = btoReserva.IDTransporteIda;
                    dtoReserva.IDTransporteVolta = btoReserva.IDTransporteVolta;
                    dtoReserva.IDAgencia = btoReserva.IDAgencia;
                    dtoReserva.IDAlojamento = btoReserva.IDAlojamento;
                    dtoReserva.nrPessoas = btoReserva.nrPessoas;
                    dtoReserva.dataReserva = btoReserva.dataReserva;
                    dtoReserva.dataPartida = btoReserva.dataPartida;
                    dtoReserva.dataChegada = btoReserva.dataChegada;

                    dtoReservas.Add(dtoReserva);
                }
            }
            catch (NotFoundAgenciaReservasException e)
            {
                throw new NotFoundAgenciaReservasException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhuma reserva encontrada!");
            }

            return dtoReservas;
        }

        public List<DTO.Reserva> getByDataReserva(String dataReserva)
        {
            BLLReserva bllReservas = new BLLReserva();
            List<DTO.Reserva> dtoReservas = new List<DTO.Reserva>();
            DTO.Reserva dtoReserva;

            try
            {
                List<BTO.Reserva> btoReservas = bllReservas.getByDataReserva(dataReserva);

                foreach (BTO.Reserva btoReserva in btoReservas)
                {
                    dtoReserva = new DTO.Reserva();
                    dtoReserva.IDReserva = btoReserva.IDReserva;
                    dtoReserva.IDCliente = btoReserva.IDCliente;
                    dtoReserva.IDPartida = btoReserva.IDPartida;
                    dtoReserva.IDChegada = btoReserva.IDChegada;
                    dtoReserva.IDTransporteIda = btoReserva.IDTransporteIda;
                    dtoReserva.IDTransporteVolta = btoReserva.IDTransporteVolta;
                    dtoReserva.IDAgencia = btoReserva.IDAgencia;
                    dtoReserva.IDAlojamento = btoReserva.IDAlojamento;
                    dtoReserva.nrPessoas = btoReserva.nrPessoas;
                    dtoReserva.dataReserva = btoReserva.dataReserva;
                    dtoReserva.dataPartida = btoReserva.dataPartida;
                    dtoReserva.dataChegada = btoReserva.dataChegada;

                    dtoReservas.Add(dtoReserva);
                }
            }
            catch (NotFoundDataReservasException e)
            {
                throw new NotFoundDataReservasException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhuma reserva encontrada!");
            }

            return dtoReservas;
        }

        public List<DTO.Reserva> getByDataPartida(String data)
        {
            BLLReserva bllReservas = new BLLReserva();
            List<DTO.Reserva> dtoReservas = new List<DTO.Reserva>();
            DTO.Reserva dtoReserva;

            try
            {
                List<BTO.Reserva> btoReservas = bllReservas.getByDataPartida(data);

                foreach (BTO.Reserva btoReserva in btoReservas)
                {
                    dtoReserva = new DTO.Reserva();
                    dtoReserva.IDReserva = btoReserva.IDReserva;
                    dtoReserva.IDCliente = btoReserva.IDCliente;
                    dtoReserva.IDPartida = btoReserva.IDPartida;
                    dtoReserva.IDChegada = btoReserva.IDChegada;
                    dtoReserva.IDTransporteIda = btoReserva.IDTransporteIda;
                    dtoReserva.IDTransporteVolta = btoReserva.IDTransporteVolta;
                    dtoReserva.IDAgencia = btoReserva.IDAgencia;
                    dtoReserva.IDAlojamento = btoReserva.IDAlojamento;
                    dtoReserva.nrPessoas = btoReserva.nrPessoas;
                    dtoReserva.dataReserva = btoReserva.dataReserva;
                    dtoReserva.dataPartida = btoReserva.dataPartida;
                    dtoReserva.dataChegada = btoReserva.dataChegada;

                    dtoReservas.Add(dtoReserva);
                }
            }
            catch (NotFoundDataReservasException e)
            {
                throw new NotFoundDataReservasException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhuma reserva encontrada!");
            }

            return dtoReservas;
        }

        public List<DTO.Reserva> getByDataChegada(String data)
        {
            BLLReserva bllReservas = new BLLReserva();
            List<DTO.Reserva> dtoReservas = new List<DTO.Reserva>();
            DTO.Reserva dtoReserva;

            try
            {
                List<BTO.Reserva> btoReservas = bllReservas.getByDataChegada(data);

                foreach (BTO.Reserva btoReserva in btoReservas)
                {
                    dtoReserva = new DTO.Reserva();
                    dtoReserva.IDReserva = btoReserva.IDReserva;
                    dtoReserva.IDCliente = btoReserva.IDCliente;
                    dtoReserva.IDPartida = btoReserva.IDPartida;
                    dtoReserva.IDChegada = btoReserva.IDChegada;
                    dtoReserva.IDTransporteIda = btoReserva.IDTransporteIda;
                    dtoReserva.IDTransporteVolta = btoReserva.IDTransporteVolta;
                    dtoReserva.IDAgencia = btoReserva.IDAgencia;
                    dtoReserva.IDAlojamento = btoReserva.IDAlojamento;
                    dtoReserva.nrPessoas = btoReserva.nrPessoas;
                    dtoReserva.dataReserva = btoReserva.dataReserva;
                    dtoReserva.dataPartida = btoReserva.dataPartida;
                    dtoReserva.dataChegada = btoReserva.dataChegada;

                    dtoReservas.Add(dtoReserva);
                }
            }
            catch (NotFoundDataReservasException e)
            {
                throw new NotFoundDataReservasException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhuma reserva encontrada!");
            }

            return dtoReservas;
        }

        public void insert(DTO.Reserva toInsert)
        {
            BLLReserva bllReserva = new BLLReserva();
            BTO.Reserva btoReserva;

            btoReserva = new BTO.Reserva();
            btoReserva.IDReserva = toInsert.IDReserva;
            btoReserva.IDCliente = toInsert.IDCliente;
            btoReserva.IDPartida = toInsert.IDPartida;
            btoReserva.IDChegada = toInsert.IDChegada;
            btoReserva.IDTransporteIda = toInsert.IDTransporteIda;
            btoReserva.IDTransporteVolta = toInsert.IDTransporteVolta;
            btoReserva.IDAgencia = toInsert.IDAgencia;
            btoReserva.IDAlojamento = toInsert.IDAlojamento;
            btoReserva.nrPessoas = toInsert.nrPessoas;
            btoReserva.dataReserva = toInsert.dataReserva;
            btoReserva.dataPartida = toInsert.dataPartida;
            btoReserva.dataChegada = toInsert.dataChegada;

            try
            {
                bllReserva.insert(btoReserva);
            }
            catch (NotFoundTranporteException e)
            {
                throw new NotFoundTranporteException(e.Message);
            }
            catch (TransporteLotacaoException e)
            {
                throw new TransporteLotacaoException(e.Message);
            }
            catch (AlojamentoLotacaoException e)
            {
                throw new AlojamentoLotacaoException(e.Message);
            }
            catch (InsertReservaException e)
            {
                throw new InsertReservaException(e.Message);
            }
            catch (Exception e)
            {
                throw new InsertReservaException(e.Message);
            }
        }

        public void update(DTO.Reserva toUpdate)
        {
            BLLReserva bllReserva = new BLLReserva();
            BTO.Reserva btoReserva;

            btoReserva = new BTO.Reserva();
            btoReserva.IDReserva = toUpdate.IDReserva;
            btoReserva.IDCliente = toUpdate.IDCliente;
            btoReserva.IDPartida = toUpdate.IDPartida;
            btoReserva.IDChegada = toUpdate.IDChegada;
            btoReserva.IDTransporteIda = toUpdate.IDTransporteIda;
            btoReserva.IDTransporteVolta = toUpdate.IDTransporteVolta;
            btoReserva.IDAgencia = toUpdate.IDAgencia;
            btoReserva.IDAlojamento = toUpdate.IDAlojamento;
            btoReserva.nrPessoas = toUpdate.nrPessoas;
            btoReserva.dataReserva = toUpdate.dataReserva;
            btoReserva.dataPartida = toUpdate.dataPartida;
            btoReserva.dataChegada = toUpdate.dataChegada;

            try
            {
                bllReserva.update(btoReserva);
            }
            catch (NotFoundTranporteException e)
            {
                throw new NotFoundTranporteException(e.Message);
            }
            catch (TransporteLotacaoException e)
            {
                throw new TransporteLotacaoException(e.Message);
            }
            catch (AlojamentoLotacaoException e)
            {
                throw new AlojamentoLotacaoException(e.Message);
            }
            catch (UpdateReservaException e)
            {
                throw new UpdateReservaException(e.Message);
            }
            catch (Exception e)
            {
                throw new UpdateReservaException(e.Message);
            }
        }

        public void delete(int id)
        {
            BLLReserva bllReserva = new BLLReserva();

            try
            {
                bllReserva.delete(id);
            }
            catch (DeleteReservaException e)
            {
                throw new DeleteReservaException(e.Message);
            }
            catch (Exception e)
            {
                throw new DeleteReservaException(e.Message);
            }
        }
    }
}
